
// /**当我们new Promise会得到一个Promise对象，该对象会有一个任务要完成，同时该对象会维护一个状态
// PromiseStatus
//     1:pending:正在处理
//     2:resolved:已完成
//     3:rejected:失败*/

// let p1 = new Promise(function (resolve, reject) {

//     /**要做的事情通过一个函数来完成，该函数会接收两个值
//     resolve
//     reject
//     这两个参数都是一个函数，当我们调用他们的时候，会改变当前任务的状态
//     resolve() => resolved
//     reject() => rejected */

//     setTimeout(() => {
//         var a = Math.random();
//         if (a < 0.5) {
//             console.log(a, 'p1失败')
//             reject(a)
//         } else {
//             console.log(a, 'p1成功')
//             resolve(a)
//         }
//     }, 1000)
// })

// /**Promise对象还有一个then方法，当前任务成功的时候，会调用该方法，并执行该方法传入函数参数
// then方法接收两个参数，它们都是函数
//     第一个参数是当前状态为resolved时候执行
//     第二个参数是当前状态为rejected时候执行*/

// p1.then(a => {
//     console.log('成功', a)
// }, a => {
//     console.log('失败', a)
// })

//     /**虽然then方法中的参数接收两个
//         一个是成功的callback
//         一个是失败的callback
//         但是，在书写的时候，如果每一个then都传这两个callback的话，编写过程太麻烦，为了能够统一的处理失败Pormise对象又提供了一个新的方法：catch,catch方法也接收一个callback
//         只要有一个Promise的状态变成了rejected，那么就会被catch方法捕获，执行catch的callback*/

//     .then((a) => {
//         return new Promise((resolve, reject) => {
//             setTimeout(() => {
//                 a *= a;
//                 console.log(a, 'p1成功')
//                 reject(a);
//             }, 1000)
//         })
//     }).then((a) => {
//         console.log(a, 'p1的then里成功')
//     }).catch((a) => {
//         console.log(a, '失败捕获')
//     })


// 1.script start 2.async2 end 3.Promise 4.script end 5.async1 end 6.promise1 7.promise2 8.setTimeout
/* console.log('script start')
async function async1() {
    await async2()
    console.log('async1 end')
}
async function async2() {
    console.log('async2 end')
}
async1()

setTimeout(function () {
    console.log('setTimeout')
}, 0)

new Promise(resolve => {
    console.log('Promise')
    resolve()
})
    .then(function () {
        console.log('promise1')
    })
    .then(function () {
        console.log('promise2')
    })

console.log('script end') */


// 1/7/4/0/3/5/2/8/6
/* (function () {

    setTimeout(() => {
        console.log(0);
    });

    new Promise(resolve => {
        console.log(1);

        setTimeout(() => {
            resolve();
            Promise.resolve().then(() => console.log(2));
            console.log(3);
        });

        Promise.resolve().then(() => console.log(4));

    }).then(() => {
        console.log(5);
        Promise.resolve().then(() => console.log(8));
        setTimeout(() => console.log(6));
    });

    console.log(7);

})(); */


/* (function () {
  var i = 0;
  setTimeout(() => {
    console.log(i)
  }, 0);
  while (i < 10000) {
    console.log(i);
    i++;
  }
})(); */


// 1-9-5-0-6-2-7-4-8-3
// (function () {
//   setTimeout(() => {
//     console.log(0);
//   });

//   new Promise(resolve => {

//     console.log(1);

//     setTimeout(() => {
//       resolve();
//       Promise.resolve().then(() => {
//         console.log(2);
//         setTimeout(() => console.log(3));
//         Promise.resolve().then(() => console.log(4));
//       });
//     });

//     Promise.resolve().then(() => console.log(5));

//   }).then(() => {

//     console.log(6);
//     Promise.resolve().then(() => console.log(7));
//     setTimeout(() => console.log(8));
//   });

//   console.log(9);
// })();

setTimeout(_ => console.log(4));
new Promise(resolve => {
  resolve();
  console.log(1);
}).then(_ => {
  console.log(3);
})
console.log(2);